package com.kancy.delay.queue.redis.config;

import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.scripting.support.ResourceScriptSource;

import java.util.List;

/**
 * <p>
 * RedisScriptConfig
 * <p>
 *
 * @author: kancy
 * @date: 2020/3/5 12:07
 **/

public class RedisScriptConfig {

    private static RedisScript delayMessageGetAndRemoveRedisScript;
    private static RedisScript delayMessageSaveRedisScript;

    static {
        initDelayMessageSaveRedisScript();
        initDelayMessageGetAndRemoveRedisScript();
    }

    private RedisScriptConfig() {
    }

    private static void initDelayMessageSaveRedisScript() {
        DefaultRedisScript defaultRedisScript =new DefaultRedisScript<Long>();
        defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/delay_queue_redis_save.lua")));
        defaultRedisScript.setResultType(Long.class);
        setDelayMessageSaveRedisScript(defaultRedisScript);
    }

    private static void initDelayMessageGetAndRemoveRedisScript() {
        DefaultRedisScript defaultRedisScript =new DefaultRedisScript<List>();
        defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/delay_queue_redis_get_and_remove.lua")));
        defaultRedisScript.setResultType(List.class);
        setDelayMessageGetAndRemoveRedisScript(defaultRedisScript);
    }

    /**
     * 获取延时消息获取并且移除的脚本
     * @return
     */
    public static RedisScript getDelayMessageGetAndRemoveRedisScript() {
        return delayMessageGetAndRemoveRedisScript;
    }

    /**
     * 获取延时消息保存的脚本
     * @return
     */
    public static RedisScript getDelayMessageSaveRedisScript() {
        return delayMessageSaveRedisScript;
    }

    private static void setDelayMessageGetAndRemoveRedisScript(RedisScript delayMessageGetAndRemoveRedisScript) {
        RedisScriptConfig.delayMessageGetAndRemoveRedisScript = delayMessageGetAndRemoveRedisScript;
    }

    private static void setDelayMessageSaveRedisScript(RedisScript delayMessageSaveRedisScript) {
        RedisScriptConfig.delayMessageSaveRedisScript = delayMessageSaveRedisScript;
    }

}
